/**
 * 
 */
package com.gopay.bis.service.bank.impl.ebank;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;

import com.gopay.bis.common.util.BankLogUtils;
import com.gopay.bis.common.util.BisPayCheckUtils;
import com.gopay.bis.common.util.constants.BisPayConstants;
import com.gopay.bis.manager.bank.ebank.CebB2bManager;
import com.gopay.common.Result;
import com.gopay.common.constants.bank.CebBankStatus;
import com.gopay.common.constants.bank.CebContants;
import com.gopay.common.constants.proccode.ProcCodeConstants;
import com.gopay.common.domain.bank.BaseMessage;
import com.gopay.common.domain.bank.ceb.ebank.CebB2bMessage;
import com.gopay.common.exception.GopayException;
import com.gopay.remote.bank.BankInteractRemoteService;

/**
 * @CebB2bBankServiceImpl.java
 * @author Ryan
 * @2013-11-28 上午10:11:05 www.gopay.com.cn Inc.All rights reserved.
 */
public class CebB2bBankServiceImpl implements BankInteractRemoteService {

    @Resource(name = "cebB2bManager")
    private CebB2bManager cebB2bManager;
    
    @Override
    public Result pay(BaseMessage base) {
        Result result = new Result(false);

        try {
            CebB2bMessage messageB2B = new CebB2bMessage();
            BeanUtils.copyProperties(base, messageB2B);
            CebB2bMessage cebB2bMessage = (CebB2bMessage) cebB2bManager.sign(messageB2B);
            result.setDefaultModel(cebB2bMessage);
            result.setSuccess(true);
        } catch (GopayException e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(e.getErrCode());
        } catch (Exception e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(ProcCodeConstants.PROC_CODE_100E6029);
        }
        return result;
    }

    @Override
    public Result bankBack(BaseMessage base) {
    	Result result = new Result(false);
        try {            
            boolean flag = false;
            CebB2bMessage messageB2B = new CebB2bMessage();
            BeanUtils.copyProperties(base, messageB2B);
            flag = (Boolean)cebB2bManager.verify(messageB2B);
            result.setModel("message", messageB2B);
            result.setDefaultModel(flag);
            result.setSuccess(true);

        	Map<String, String> param = new HashMap<String, String>();
            // 银行返回成功状态
            if (result.isSuccess() && flag) {                    
                param.put("orderId", messageB2B.getOrderId());
                param.put("amt", messageB2B.getAmount().toString());
                param.put("cardType", "Unknown");
                param.put("notifyNum", "1");
                param.put("payStatus", "00");
                param.put("retCode", "00");
                param.put("retMsg", "验签成功");
                param.put("signData", messageB2B.getSignMessage());
                param.put("isFront", String.valueOf(base.isFront()));
                result.setModel("isNotifyCashier", param);
                result.setOrderStatus(true);
            } else {
                // 通知后台地址该订单失败
                param.put("orderId", messageB2B.getOrderId());
                param.put("amt", messageB2B.getAmount().toString());
                param.put("cardType", "Unknown");
                param.put("notifyNum", "1");
                param.put("payStatus", "01");
                param.put("retCode", "01");
                param.put("retMsg", "验签失败");
                param.put("signData", messageB2B.getSignMessage());
                param.put("isFront", String.valueOf(base.isFront()));
                result.setModel("isNotifyCashier", param);
                result.setOrderStatus(false);
            }
        
        } catch (GopayException e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(e.getErrCode());
        } catch (Exception e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(ProcCodeConstants.PROC_CODE_100E6064);
        }
        return result;
    }

    @Override
    public Result query(BaseMessage base) {
        Result result = new Result(false);
        try {
            CebB2bMessage messageB2B = new CebB2bMessage();
            BeanUtils.copyProperties(base, messageB2B);
            CebB2bMessage res = (CebB2bMessage) cebB2bManager.query(messageB2B);
            result.setSuccess(true);
            result.setDefaultModel(res);
            if(BisPayCheckUtils.checkExternalOrderID(messageB2B.getOrderId())){
        		Map<String, String> param = new HashMap<String, String>();
        		param.put("orderId", messageB2B.getOrderId());
        		param.put("amount", messageB2B.getAmount().toString());
        		if (res == null) {
        			// 查询订单为空
        			param.put("returnCode", BisPayConstants.QUERYSTATE_FAIL);
        			param.put("returnMessage", "银行返回对账结果为空");
        			param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
					result.setModel("queryResult", param);
					return result;
        		}
        		if (!CebContants.QUERY_CEB_SUCC.equals(res.getRespCode())) {
        			// 查询订单错误
        			param.put("returnCode", BisPayConstants.QUERYSTATE_FAIL);
        			param.put("returnMessage", "查询订单失败");
        			param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
					result.setModel("queryResult", param);
					return result;
    			}			
    			if (res.getTransStatus() != null && !"".equals(res.getTransStatus())) {
    				param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
    				//成功处理
    				if (StringUtils.equals(CebContants.CEB_TRANS_STATUS_SUCCESS,res.getTransStatus())) {
    					param.put("tradeState", BisPayConstants.TRADESTATE_SUCCESS);
    					param.put("returnMessage", "交易成功");
    				}
    				//失败处理
    				else if(StringUtils.equals(CebContants.CEB_TRANS_STATUS_FAILED,res.getTransStatus())){	
    					param.put("tradeState", BisPayConstants.TRADESTATE_FAIL);
    					param.put("returnMessage", "交易失败");
    				}else{
    					param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
    					param.put("returnMessage", CebBankStatus.getName(res.getTransStatus()));
    				}
    			} else {
    				param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
					param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
					param.put("returnMessage", "银行返回订单未查到");
    			}
        		result.setModel("queryResult", param);
        	}
        } catch (GopayException e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(e.getErrCode());
        } catch (Exception e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(ProcCodeConstants.PROC_CODE_100E6033);
        }
        return result;
    }

    @Override
    public Result refund(BaseMessage base) {
        return null;
    }

    @Override
    public Result dayend(BaseMessage base) {
        return null;
    }

	@Override
	public Result queryBack(BaseMessage base) {
		// TODO Auto-generated method stub
		return null;
	}

    @Override
    public Result refundBack(BaseMessage base) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Result refundQuery(BaseMessage base) {
        // TODO Auto-generated method stub
        return null;
    }

	@Override
	public Result sendBankRefund(BaseMessage base) {
		// TODO Auto-generated method stub
		return null;
	}

}
